﻿using System;
using System.Collections.Generic;
using System.Text;


using System.Data;
using System.Data.Odbc;
using WLMCoreLibrary;

using System.Xml;
using System.Xml.Serialization;
using System.ComponentModel;
using System.CodeDom.Compiler;
using System.Configuration;
using System.IO;
using System.Web;

namespace SAW_Core
{
    public class CuentaBancaria : BaseClass
    {


        #region public properties
        [XmlAttribute()]
        public String institucion { get;set; }
        [XmlAttribute()]
        public String alias { get;set; }
        [XmlAttribute()]
        public String cuenta { get;set; }
        [XmlAttribute()]
        public String moneda { get;set; }
        [XmlAttribute()]
        public Decimal saldoActual { get;set; }
        [XmlAttribute()]
        public int numeroUltimoCheque { get;set; }
        [XmlAttribute()]
        public String numeroSucursal { get;set; }
        [XmlAttribute()]
        public String nombreSucursal { get;set; }
        [XmlAttribute()]
        public String direccionSucursal { get;set; }
        [XmlAttribute()]
        public String Alias2 { get;set; }
        public Boolean Activo { get;set; }
        public Boolean ParaPOS { get;set; }
        [XmlIgnore()]
        public List<MovimientoBancario> Movimientos { get;set; }
        [XmlIgnore()]
        public List<SalidaDinero> Cheques { get; set; }
        [XmlIgnore()]
        public List<MovimientoBancario> ListaMovimientos { get;set; }
        #endregion

        #region constructors
        public CuentaBancaria()
        {
        }

        public CuentaBancaria(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("BANCOS");
            string queryString = "";
            queryString = "SELECT * FROM BANCOS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public CuentaBancaria(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM BANCOS WHERE id='" + registryId + "'";
            
            this.GetRecord(queryString);
        }

        public CuentaBancaria(int registryId,bool loadFullInfo,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM BANCOS WHERE id='" + registryId + "'";
            this.GetRecord(queryString);
         ListaMovimientos = new MovimientoBancarioCollection(this,ref ConexionDB).Elementos;
        }

        public CuentaBancaria(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            Activo = false;
            Save();
            //string queryString = "";
            //queryString = "DELETE FROM BANCOS WHERE id='" + this.id + "'";
            //ConexionDBInterna.ExecuteCommand(queryString);

        }

        public void AjustarCuentaBancaria(decimal SaldoAjuste)
        {
            
            decimal saldo = SaldoAjuste;
         saldoActual = SaldoAjuste;
            Save();
            foreach (MovimientoBancario mov in ListaMovimientos)
            {
                try
                {
                    if (mov.activo)
                    {
                        mov.saldoFinal = saldo;
                        if (mov.deposito)
                            saldo -= mov.monto;
                        else
                            saldo += mov.monto;
                        mov.saldoInicial = saldo;
                        mov.Save();
                    }
                }
                catch (Exception ex)
                {
                    ErrorManagement.LogError(ex, HttpContext.Current);
                    
                }
            }            
            //if (ErrorManagement.ListaErrores.Count > 0)
            //    ErrorManagement.SendErrorLog();
            
              
                
        }

        public bool ProcesarMovimientoBancario(MovimientoBancario movimiento)
        {
            //if (saldoActual > movimiento.monto)
            {
                movimiento.saldoInicial = saldoActual;


                if (movimiento.retiro)
                {
                    saldoActual -= movimiento.monto;
                    movimiento.saldoFinal = movimiento.saldoInicial - movimiento.monto;
                }
                if (movimiento.deposito)
                {
                    saldoActual += movimiento.monto;
                    movimiento.saldoFinal = movimiento.saldoInicial + movimiento.monto;
                }
                movimiento.Save();
                Save();
                return true;
            }

            //return false;
        }

        public void GenerarArchivoXML()
        {
            StringBuilder salida = new StringBuilder();
            XmlSerializer serializer = new XmlSerializer(typeof(CuentaBancaria));

            string rutaArchivos = "";
            string nombreArchivo = id.ToString("00000");

            rutaArchivos += "CuentasBancariasXML/" + id.ToString("000") + "/" + id.ToString("00000") + "/";
            DirectoryInfo directorio = new DirectoryInfo(ConfigurationManager.AppSettings["sitePath"] + rutaArchivos);
            if (!directorio.Exists)
                directorio.Create();



            string archivo = ConfigurationManager.AppSettings["sitePath"] + rutaArchivos + nombreArchivo + ".xml";
            TextWriter tw = new StreamWriter(archivo);
            serializer.Serialize(tw, this);
            tw.Close();

            //PDFCreator pdf = new PDFCreator();
            //pdf.CrearPDFdeHTML(WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + nombreArchivo + ".xml", ConfigurationManager.AppSettings["siteURL"] + "cotizacionImpresion.xsl"), nombreArchivo + ".pdf", rutaArchivos, false, false);
        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                 fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                 fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("institucion")))
                 institucion = (System.String)reader["institucion"];
                if (!reader.IsDBNull(reader.GetOrdinal("alias")))
                 alias = (System.String)reader["alias"];
                if (!reader.IsDBNull(reader.GetOrdinal("cuenta")))
                 cuenta = (System.String)reader["cuenta"];
                if (!reader.IsDBNull(reader.GetOrdinal("moneda")))
                 moneda = (System.String)reader["moneda"];
                if (!reader.IsDBNull(reader.GetOrdinal("saldoActual")))
                 saldoActual = (System.Decimal)reader["saldoActual"];
                if (!reader.IsDBNull(reader.GetOrdinal("numeroUltimoCheque")))
                 numeroUltimoCheque = (System.Int32)reader["numeroUltimoCheque"];
                if (!reader.IsDBNull(reader.GetOrdinal("numeroSucursal")))
                 numeroSucursal = (System.String)reader["numeroSucursal"];
                if (!reader.IsDBNull(reader.GetOrdinal("nombreSucursal")))
                 nombreSucursal = (System.String)reader["nombreSucursal"];
                if (!reader.IsDBNull(reader.GetOrdinal("direccionSucursal")))
                 direccionSucursal = (System.String)reader["direccionSucursal"];
                if (!reader.IsDBNull(reader.GetOrdinal("activo")))
                 Activo = Convert.ToBoolean( reader["activo"]);
                if (!reader.IsDBNull(reader.GetOrdinal("paraPOS")))
                 ParaPOS = Convert.ToBoolean(reader["paraPOS"]);
                if (!reader.IsDBNull(reader.GetOrdinal("alias2")))
                 Alias2 = (System.String)reader["alias2"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                 fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                 fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["institucion"] != null)
                 institucion = (System.String)dataRow["institucion"];
                if (dataRow["alias"] != null)
                 alias = (System.String)dataRow["alias"];
                if (dataRow["cuenta"] != null)
                 cuenta = (System.String)dataRow["cuenta"];
                if (dataRow["moneda"] != null)
                 moneda = (System.String)dataRow["moneda"];
                if (dataRow["saldoActual"] != null)
                 saldoActual = (System.Decimal)dataRow["saldoActual"];
                if (dataRow["numeroUltimoCheque"] != null)
                 numeroUltimoCheque = (System.Int32)dataRow["numeroUltimoCheque"];
                if (dataRow["numeroSucursal"] != null)
                 numeroSucursal = (System.String)dataRow["numeroSucursal"];
                if (dataRow["nombreSucursal"] != null)
                 nombreSucursal = (System.String)dataRow["nombreSucursal"];
                if (dataRow["direccionSucursal"] != null)
                 direccionSucursal = (System.String)dataRow["direccionSucursal"];
                if (dataRow["activo"] != null)
                 Activo = (System.Boolean)dataRow["activo"];
                if (dataRow["paraPOS"] != null)
                 ParaPOS = (System.Boolean)dataRow["paraPOS"];
                if (dataRow["alias2"] != null)
                 Alias2 = (System.String)dataRow["alias2"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE BANCOS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",institucion=\"" + WLMFunctions.comillas(institucion) + "\"");
            strCommand.Append(",alias=\"" + WLMFunctions.comillas(alias) + "\"");
            strCommand.Append(",cuenta=\"" + WLMFunctions.comillas(cuenta) + "\"");
            strCommand.Append(",moneda=\"" + WLMFunctions.comillas(moneda) + "\"");
            strCommand.Append(",saldoActual=\"" + WLMFunctions.comillas(saldoActual) + "\"");
            strCommand.Append(",numeroUltimoCheque='" + numeroUltimoCheque.ToString() + "'");
            strCommand.Append(",numeroSucursal=\"" + WLMFunctions.comillas(numeroSucursal) + "\"");
            strCommand.Append(",nombreSucursal=\"" + WLMFunctions.comillas(nombreSucursal) + "\"");
            strCommand.Append(",direccionSucursal=\"" + WLMFunctions.comillas(direccionSucursal) + "\"");
            strCommand.Append(",activo=\"" + Convert.ToInt16(Activo) + "\"");
            strCommand.Append(",paraPOS=\"" + Convert.ToInt16(ParaPOS) + "\"");
            strCommand.Append(",alias2=\"" + WLMFunctions.comillas(Alias2) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class CuentaBancariaCollection
    {
        
        private List<CuentaBancaria> _items;
        private List<CuentaBancaria> _cuentas;
        [XmlIgnore()]
        public List<CuentaBancaria> Elementos { get;set; }
        public CuentaBancariaCollection()
        {
        }
        public CuentaBancariaCollection(ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM BANCOS ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
         Elementos = new List<CuentaBancaria>();
            while (dataReader.Read())
            {
                CuentaBancaria newItem = new CuentaBancaria(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
             Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }


        public CuentaBancariaCollection(bool paraPOS,dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM BANCOS WHERE paraPOS=1 ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
         Elementos = new List<CuentaBancaria>();
            while (dataReader.Read())
            {
                CuentaBancaria newItem = new CuentaBancaria(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
             Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public void LlenarLista()
        {
         Cuentas = new List<CuentaBancaria>();
            foreach (CuentaBancaria cuenta in Elementos)
            {
                Cuentas.Add(cuenta);
            }
        }

        [XmlElement("CuentaBancaria")]
        public List<CuentaBancaria> Cuentas { get;set; }
    }

    public class MovimientoBancario : BaseClass
    {


        #region public properties
        [XmlAttribute()]
        public Decimal saldoInicial { get;set; }
        [XmlAttribute()]
        public Decimal monto { get;set; }
        [XmlAttribute()]
        public String descripcion { get;set; }
        [XmlAttribute()]
        public String referenciaNumerica { get;set; }
        [XmlAttribute()]
        public String referencia { get;set; }
        [XmlAttribute()]
        public Decimal saldoFinal { get;set; }
        [XmlAttribute()]
        public Boolean retiro { get;set; }
        [XmlAttribute()]
        public Boolean deposito { get;set; }
        [XmlAttribute()]
        public DateTime fechaAplicacion { get;set; }
        [XmlAttribute()]
        public String NoDocumento { get;set; }
        [XmlAttribute()]
        public String nombreDepositante { get;set; }
        [XmlAttribute()]
        public String nombreDepositario { get;set; }
        [XmlAttribute()]
        public int idCheque { get;set; }
        [XmlAttribute()]
        public int idCotizacion { get;set; }
        [XmlAttribute()]
        public int idCompra { get;set; }
        [XmlAttribute()]
        public Boolean contabilizado { get;set; }
        [XmlAttribute()]
        public DateTime fechaContabilizado { get;set; }
        [XmlAttribute()]
        public int idCliente { get;set; }
        [XmlAttribute()]
        public int idProveedor { get;set; }
        [XmlAttribute()]
        public int idGasto { get;set; }
        [XmlAttribute()]
        public int idGastoTipo { get;set; }
        [XmlAttribute()]
        public int idCuentaBancaria { get;set; }
        [XmlAttribute()]
        public String Concepto { get;set; }
        [XmlAttribute()]
        public int TipoMovimiento { get;set; }
        [XmlAttribute()]
        public Boolean activo { get;set; }
        #endregion

        #region constructors
        public MovimientoBancario(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("BANCOSMOVIMIENTOS");
            string queryString = "";
            queryString = "SELECT * FROM BANCOSMOVIMIENTOS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public MovimientoBancario(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM BANCOSMOVIMIENTOS WHERE id='" + registryId + "'";
            
            this.GetRecord(queryString);
        }

        public MovimientoBancario(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "UPDATE BANCOSMOVIMIENTOS SET activo=0 WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

            CuentaBancaria cuenta = new CuentaBancaria(idCuentaBancaria,true,ref ConexionDBInterna);
            decimal saldoNuevo = cuenta.saldoActual - monto;
            cuenta.AjustarCuentaBancaria(saldoNuevo);
        }


        #endregion

        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                 fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                 fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("saldoInicial")))
                 saldoInicial = (System.Decimal)reader["saldoInicial"];
                if (!reader.IsDBNull(reader.GetOrdinal("monto")))
                 monto = (System.Decimal)reader["monto"];
                if (!reader.IsDBNull(reader.GetOrdinal("descripcion")))
                 descripcion = (System.String)reader["descripcion"];
                if (!reader.IsDBNull(reader.GetOrdinal("referenciaNumerica")))
                 referenciaNumerica = (System.String)reader["referenciaNumerica"];
                if (!reader.IsDBNull(reader.GetOrdinal("referencia")))
                 referencia = (System.String)reader["referencia"];
                if (!reader.IsDBNull(reader.GetOrdinal("saldoFinal")))
                 saldoFinal = (System.Decimal)reader["saldoFinal"];
                if (!reader.IsDBNull(reader.GetOrdinal("retiro")))
                 retiro = Convert.ToBoolean(reader["retiro"]);
                if (!reader.IsDBNull(reader.GetOrdinal("deposito")))
                 deposito = Convert.ToBoolean(reader["deposito"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaAplicacion")))
                 fechaAplicacion = Convert.ToDateTime(reader["fechaAplicacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("NoDocumento")))
                 NoDocumento = (System.String)reader["NoDocumento"];
                if (!reader.IsDBNull(reader.GetOrdinal("nombreDepositante")))
                 nombreDepositante = (System.String)reader["nombreDepositante"];
                if (!reader.IsDBNull(reader.GetOrdinal("nombreDepositario")))
                 nombreDepositario = (System.String)reader["nombreDepositario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCheque")))
                    idCheque = (System.Int32)reader["idCheque"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCotizacion")))
                    idCotizacion = (System.Int32)reader["idCotizacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCompra")))
                    idCompra = (System.Int32)reader["idCompra"];
                if (!reader.IsDBNull(reader.GetOrdinal("contabilizado")))
                 contabilizado = Convert.ToBoolean(reader["contabilizado"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaContabilizado")))
                 fechaContabilizado = Convert.ToDateTime(reader["fechaContabilizado"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idCliente")))
                    idCliente = (System.Int32)reader["idCliente"];
                if (!reader.IsDBNull(reader.GetOrdinal("idProveedor")))
                    idProveedor = (System.Int32)reader["idProveedor"];
                if (!reader.IsDBNull(reader.GetOrdinal("idGasto")))
                    idGasto = (System.Int32)reader["idGasto"];
                if (!reader.IsDBNull(reader.GetOrdinal("idGastoTipo")))
                    idGastoTipo = (System.Int32)reader["idGastoTipo"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCuentaBancaria")))
                    idCuentaBancaria = (System.Int32)reader["idCuentaBancaria"];
                if (!reader.IsDBNull(reader.GetOrdinal("concepto")))
                 Concepto = (System.String)reader["concepto"];
                if (!reader.IsDBNull(reader.GetOrdinal("TipoMovimiento")))
                 TipoMovimiento = (System.Int32)reader["TipoMovimiento"];
                if (!reader.IsDBNull(reader.GetOrdinal("activo")))
                 activo = Convert.ToBoolean(reader["activo"]);
            }
        }

        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                 fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                 fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["saldoInicial"] != null)
                 saldoInicial = (System.Decimal)dataRow["saldoInicial"];
                if (dataRow["monto"] != null)
                 monto = (System.Decimal)dataRow["monto"];
                if (dataRow["descripcion"] != null)
                 descripcion = (System.String)dataRow["descripcion"];
                if (dataRow["referenciaNumerica"] != null)
                 referenciaNumerica = (System.String)dataRow["referenciaNumerica"];
                if (dataRow["referencia"] != null)
                 referencia = (System.String)dataRow["referencia"];
                if (dataRow["saldoFinal"] != null)
                 saldoFinal = (System.Decimal)dataRow["saldoFinal"];
                if (dataRow["retiro"] != null)
                 retiro = (bool)dataRow["retiro"];
                if (dataRow["deposito"] != null)
                 deposito = (bool)dataRow["deposito"];
                if (dataRow["fechaAplicacion"] != null)
                 fechaAplicacion = (System.DateTime)dataRow["fechaAplicacion"];
                if (dataRow["NoDocumento"] != null)
                 NoDocumento = (System.String)dataRow["NoDocumento"];
                if (dataRow["nombreDepositante"] != null)
                 nombreDepositante = (System.String)dataRow["nombreDepositante"];
                if (dataRow["nombreDepositario"] != null)
                 nombreDepositario = (System.String)dataRow["nombreDepositario"];
                if (dataRow["idCheque"] != null)
                    idCheque = (System.Int32)dataRow["idCheque"];
                if (dataRow["idCotizacion"] != null)
                    idCotizacion = (System.Int32)dataRow["idCotizacion"];
                if (dataRow["idCompra"] != null)
                    idCompra = (System.Int32)dataRow["idCompra"];
                if (dataRow["contabilizado"] != null)
                 contabilizado = (bool)dataRow["contabilizado"];
                if (dataRow["fechaContabilizado"] != null)
                 fechaContabilizado = (System.DateTime)dataRow["fechaContabilizado"];
                if (dataRow["idCliente"] != null)
                    idCliente = (System.Int32)dataRow["idCliente"];
                if (dataRow["idProveedor"] != null)
                    idProveedor = (System.Int32)dataRow["idProveedor"];
                if (dataRow["idGasto"] != null)
                    idGasto = (System.Int32)dataRow["idGasto"];
                if (dataRow["idGastoTipo"] != null)
                    idGastoTipo = (System.Int32)dataRow["idGastoTipo"];
                if (dataRow["idCuentaBancaria"] != null)
                    idCuentaBancaria = (System.Int32)dataRow["idCuentaBancaria"];
                if (dataRow["concepto"] != null)
                 Concepto = (System.String)dataRow["concepto"];
                if (dataRow["TipoMovimiento"] != null)
                 TipoMovimiento = (System.Int32)dataRow["TipoMovimiento"];
                if (dataRow["activo"] != null)
                 activo = (bool)dataRow["activo"];
            }
        }

        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE BANCOSMOVIMIENTOS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",saldoInicial=\"" + WLMFunctions.comillas(saldoInicial) + "\"");
            strCommand.Append(",monto=\"" + WLMFunctions.comillas(monto) + "\"");
            strCommand.Append(",descripcion=\"" + WLMFunctions.comillas(descripcion) + "\"");
            strCommand.Append(",referenciaNumerica=\"" + WLMFunctions.comillas(referenciaNumerica) + "\"");
            strCommand.Append(",referencia=\"" + WLMFunctions.comillas(referencia) + "\"");
            strCommand.Append(",saldoFinal=\"" + WLMFunctions.comillas(saldoFinal) + "\"");
            strCommand.Append(",retiro='" + Convert.ToInt16(retiro) + "'");
            strCommand.Append(",deposito='" + Convert.ToInt16(deposito) + "'");
            strCommand.Append(",fechaAplicacion='" + fechaAplicacion.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",NoDocumento=\"" + WLMFunctions.comillas(NoDocumento) + "\"");
            strCommand.Append(",nombreDepositante=\"" + WLMFunctions.comillas(nombreDepositante) + "\"");
            strCommand.Append(",nombreDepositario=\"" + WLMFunctions.comillas(nombreDepositario) + "\"");
            strCommand.Append(",idCheque='" + this.idCheque.ToString() + "'");
            strCommand.Append(",idCotizacion='" + this.idCotizacion.ToString() + "'");
            strCommand.Append(",idCompra='" + this.idCompra.ToString() + "'");
            strCommand.Append(",contabilizado='" + Convert.ToInt16(contabilizado) + "'");
            strCommand.Append(",fechaContabilizado='" + fechaContabilizado.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idCliente='" + this.idCliente.ToString() + "'");
            strCommand.Append(",idProveedor='" + this.idProveedor.ToString() + "'");
            strCommand.Append(",idGasto='" + this.idGasto.ToString() + "'");
            strCommand.Append(",idGastoTipo='" + this.idGastoTipo.ToString() + "'");
            strCommand.Append(",idCuentaBancaria='" + this.idCuentaBancaria.ToString() + "'");
            strCommand.Append(",concepto=\"" + WLMFunctions.comillas(Concepto) + "\"");
            strCommand.Append(",TipoMovimiento='" + TipoMovimiento.ToString() + "'");
            strCommand.Append(",activo='" + Convert.ToInt16(activo) + "'");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class MovimientoBancarioCollection
    {
        
        private List<MovimientoBancario> _items;
        public List<MovimientoBancario> Elementos { get;set; }
        public MovimientoBancarioCollection()
        {
        }
        public MovimientoBancarioCollection(ref dbConnector ConexionDB)
        {
          
            string strCommand = "SELECT id FROM BANCOSMOVIMIENTOS ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
         Elementos = new List<MovimientoBancario>();
            while (dataReader.Read())
            {
                MovimientoBancario newItem = new MovimientoBancario(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
             Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public MovimientoBancarioCollection(CuentaBancaria cuenta,ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM BANCOSMOVIMIENTOS WHERE idCuentaBancaria='"+cuenta.id+"' AND activo=1 ORDER BY id DESC";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
         Elementos = new List<MovimientoBancario>();
            while (dataReader.Read())
            {
                MovimientoBancario newItem = new MovimientoBancario(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
             Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }

    public class SalidaDinero : BaseClass
    {
     

        #region public properties
        [XmlAttribute()]
        public int idCuenta { get;set; }
        [XmlAttribute()]
        public int NoCheque { get;set; }
        [XmlAttribute()]
        public int idProveedor { get;set; }
        [XmlAttribute()]
        public DateTime FechaPago { get;set; }
        [XmlAttribute()]
        public Decimal Monto { get;set; }
        [XmlAttribute()]
        public String ANombreDe { get;set; }
        [XmlAttribute()]
        public int idCompra { get;set; }
        [XmlAttribute()]
        public Decimal SaldoInicialCuenta { get;set; }
        [XmlAttribute()]
        public Decimal SaldoFinalCuenta { get;set; }
        [XmlAttribute()]
        public Boolean cobrado { get;set; }
        [XmlAttribute()]
        public Boolean cancelado { get;set; }
        [XmlAttribute()]
        public Boolean impreso { get;set; }
        [XmlAttribute()]
        public String Concepto { get;set; }
        [XmlAttribute()]
        public String MontoLetra { get;set; }
        [XmlAttribute()]
        public DateTime FechaGeneracion { get;set; }
        [XmlAttribute()]
        public int tipoRetiro { get;set; }
        [XmlAttribute()]
        public String NoReferencia { get;set; }
        [XmlAttribute()]
        public String NoAutorizacion { get;set; }
        [XmlAttribute()]
        public int IdCliente
        {
            get;set;

        }
        [XmlAttribute()]
        public int IdCotizacion
        {
            get;set;
        }

        #endregion

        #region constructors
        public SalidaDinero()
        {
        }

        public SalidaDinero(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("CHEQUES");
            string queryString = "";
            queryString = "SELECT * FROM CHEQUES WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public SalidaDinero(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM CHEQUES WHERE id='" + registryId + "'";
            
            this.GetRecord(queryString);
        }
        public SalidaDinero(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM CHEQUES WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }

        public int RealizarPago()
        {
            if (!cobrado)
            {
                cobrado = true;
                CuentaBancaria cuentaBancaria = new CuentaBancaria(idCuenta,ref ConexionDBInterna);
                MovimientoBancario movimiento = new MovimientoBancario(ref ConexionDBInterna);
                movimiento.idCuentaBancaria = idCuenta;
                movimiento.NoDocumento = NoCheque.ToString();
                movimiento.fechaAplicacion = DateTime.Now;
                movimiento.idCheque = id;
                movimiento.nombreDepositario = ANombreDe;
                movimiento.retiro = true;
                movimiento.monto = Monto;
                movimiento.descripcion = movimiento.Concepto = Concepto;
                cuentaBancaria.ProcesarMovimientoBancario(movimiento);
                Save();
                return movimiento.id;
            }
            return -1;
        }

        public void PagoChequeCompra(Compra compra,MovimientoBancario movimiento)
        {
            CompraPago pagoCompra = new CompraPago(ref ConexionDBInterna);
            Proveedor proveedor = new Proveedor(idProveedor,ref ConexionDBInterna);
            pagoCompra.idMovimientoBancario = RealizarPago();
            pagoCompra.SaldoAntesPago = compra.SaldoPendiente;
            compra.SaldoPendiente = compra.SaldoPendiente-Monto;
            compra.SaldoPagado += Monto;
            pagoCompra.SaldoDespuesPago = compra.SaldoPendiente;
            pagoCompra.idCompra = compra.id;
            pagoCompra.FechaRealizacion = movimiento.fechaAplicacion;
            pagoCompra.TotalPago = Monto;
            pagoCompra.idMovimientoBancario = movimiento.id;
            pagoCompra.Save();
            proveedor.SaldoActual = proveedor.SaldoActual-Monto;
            proveedor.FechaUltimoPago = movimiento.fechaAplicacion;
            compra.Save();
            proveedor.Save();
        }

        public void GenerarArchivoXML()
        {
            StringBuilder salida = new StringBuilder();
            XmlSerializer serializer = new XmlSerializer(typeof(SalidaDinero));

            string rutaArchivos = "";
            string nombreArchivo = id.ToString("00000");

            rutaArchivos += "ChequesXML/"+idCuenta.ToString("000")+"/" + id.ToString("00000") + "/";
            DirectoryInfo directorio = new DirectoryInfo(ConfigurationManager.AppSettings["sitePath"] + rutaArchivos);
            if (!directorio.Exists)
                directorio.Create();



            string archivo = ConfigurationManager.AppSettings["sitePath"] + rutaArchivos + nombreArchivo + ".xml";
            TextWriter tw = new StreamWriter(archivo);
            serializer.Serialize(tw, this);
            tw.Close();

            //PDFCreator pdf = new PDFCreator();
            //pdf.CrearPDFdeHTML(WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + nombreArchivo + ".xml", ConfigurationManager.AppSettings["siteURL"] + "cotizacionImpresion.xsl"), nombreArchivo + ".pdf", rutaArchivos, false, false);
        }
        #endregion

        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                 fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                 fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCuenta")))
                    idCuenta = (System.Int32)reader["idCuenta"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoCheque")))
                 NoCheque = (System.Int32)reader["NoCheque"];
                if (!reader.IsDBNull(reader.GetOrdinal("idProveedor")))
                    idProveedor = (System.Int32)reader["idProveedor"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCliente")))
                    IdCliente = (System.Int32)reader["idCliente"];
                if (!reader.IsDBNull(reader.GetOrdinal("FechaPago")))
                 FechaPago = Convert.ToDateTime(reader["FechaPago"]);
                if (!reader.IsDBNull(reader.GetOrdinal("Monto")))
                 Monto = (System.Decimal)reader["Monto"];
                if (!reader.IsDBNull(reader.GetOrdinal("ANombreDe")))
                 ANombreDe = (System.String)reader["ANombreDe"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCompra")))
                    idCompra = (System.Int32)reader["idCompra"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCotizacion")))
                    IdCotizacion = (System.Int32)reader["idCotizacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("SaldoInicialCuenta")))
                 SaldoInicialCuenta = (System.Decimal)reader["SaldoInicialCuenta"];
                if (!reader.IsDBNull(reader.GetOrdinal("SaldoFinalCuenta")))
                 SaldoFinalCuenta = (System.Decimal)reader["SaldoFinalCuenta"];
                if (!reader.IsDBNull(reader.GetOrdinal("cobrado")))
                 cobrado = Convert.ToBoolean(reader["cobrado"]);
                if (!reader.IsDBNull(reader.GetOrdinal("cancelado")))
                 cancelado = Convert.ToBoolean(reader["cancelado"]);
                if (!reader.IsDBNull(reader.GetOrdinal("impreso")))
                 impreso = Convert.ToBoolean(reader["impreso"]);
                if (!reader.IsDBNull(reader.GetOrdinal("concepto")))
                 Concepto = (System.String)reader["concepto"];
                if (!reader.IsDBNull(reader.GetOrdinal("tipoRetiro")))
                 tipoRetiro = (System.Int32)reader["tipoRetiro"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoReferencia")))
                 NoReferencia = (System.String)reader["NoReferencia"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoAutorizacion")))
                 NoAutorizacion = (System.String)reader["NoAutorizacion"];
            }
        }

        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                 fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                 fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idCuenta"] != null)
                    idCuenta = (System.Int32)dataRow["idCuenta"];
                if (dataRow["NoCheque"] != null)
                 NoCheque = (System.Int32)dataRow["NoCheque"];
                if (dataRow["idProveedor"] != null)
                    idProveedor = (System.Int32)dataRow["idProveedor"];
                if (dataRow["idCliente"] != null)
                    IdCliente = (System.Int32)dataRow["idCliente"];
                if (dataRow["FechaPago"] != null)
                 FechaPago = (System.DateTime)dataRow["FechaPago"];
                if (dataRow["Monto"] != null)
                 Monto = (System.Decimal)dataRow["Monto"];
                if (dataRow["ANombreDe"] != null)
                 ANombreDe = (System.String)dataRow["ANombreDe"];
                if (dataRow["idCompra"] != null)
                    idCompra = (System.Int32)dataRow["idCompra"];
                if (dataRow["SaldoInicialCuenta"] != null)
                 SaldoInicialCuenta = (System.Decimal)dataRow["SaldoInicialCuenta"];
                if (dataRow["SaldoFinalCuenta"] != null)
                 SaldoFinalCuenta = (System.Decimal)dataRow["SaldoFinalCuenta"];
                if (dataRow["cobrado"] != null)
                 cobrado = (bool)dataRow["cobrado"];
                if (dataRow["cancelado"] != null)
                 cancelado = (bool)dataRow["cancelado"];
                if (dataRow["impreso"] != null)
                 impreso = (bool)dataRow["impreso"];
                if (dataRow["concepto"] != null)
                 Concepto = (System.String)dataRow["concepto"];
                if (dataRow["tipoRetiro"] != null)
                 tipoRetiro = (System.Int32)dataRow["tipoRetiro"];
                if (dataRow["NoReferencia"] != null)
                 NoReferencia = (System.String)dataRow["NoReferencia"];
                if (dataRow["NoAutorizacion"] != null)
                 NoAutorizacion = (System.String)dataRow["NoAutorizacion"];
            }
        }

        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE CHEQUES set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idCuenta='" + this.idCuenta.ToString() + "'");
            strCommand.Append(",NoCheque='" + NoCheque.ToString() + "'");
            strCommand.Append(",idProveedor='" + this.idProveedor.ToString() + "'");
            strCommand.Append(",idCliente='" + this.IdCliente.ToString() + "'");
            strCommand.Append(",FechaPago='" + FechaPago.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",Monto=\"" + WLMFunctions.comillas(Monto) + "\"");
            strCommand.Append(",ANombreDe=\"" + WLMFunctions.comillas(ANombreDe) + "\"");
            strCommand.Append(",idCompra='" + this.idCompra.ToString() + "'");
            strCommand.Append(",idCotizacion='" + this.IdCotizacion.ToString() + "'");
            strCommand.Append(",SaldoInicialCuenta=\"" + WLMFunctions.comillas(SaldoInicialCuenta) + "\"");
            strCommand.Append(",SaldoFinalCuenta=\"" + WLMFunctions.comillas(SaldoFinalCuenta) + "\"");
            strCommand.Append(",cobrado='" + Convert.ToInt16(cobrado) + "'");
            strCommand.Append(",cancelado='" + Convert.ToInt16(cancelado) + "'");
            strCommand.Append(",impreso='" + Convert.ToInt16(impreso) + "'");
            strCommand.Append(",concepto=\"" + WLMFunctions.comillas(Concepto) + "\"");
            strCommand.Append(",tipoRetiro='" + tipoRetiro.ToString() + "'");
            strCommand.Append(",NoReferencia=\"" + WLMFunctions.comillas(NoReferencia) + "\"");
            strCommand.Append(",NoAutorizacion=\"" + WLMFunctions.comillas(NoAutorizacion) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());


        }
        #endregion
    }

    public class ChequeCollection
    {
        
        private List<SalidaDinero> _items;
        public List<SalidaDinero> Elementos { get;set; }
        public ChequeCollection()
        {
        }
        public ChequeCollection(ref dbConnector ConexionDB)
        {
           
            string strCommand = "SELECT id FROM CHEQUES ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
         Elementos = new List<SalidaDinero>();
            while (dataReader.Read())
            {
                SalidaDinero newItem = new SalidaDinero(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
             Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }
}
